#一、在消息数组中包含系统提示
import os
from http.client import HTTPException

from pydantic import BaseModel

from demo.main import app, client, ChatResponse


class ChatRequest(BaseModel):
    message: str
    system_prompt: str = None  # 可选的系统提示
    conversation_history: List[dict] = None  # 对话历史
    model: str = os.getenv("DEFAULT_MODEL", "deepseek-ai/DeepSeek-V3")
    max_tokens: int = 2048
    temperature: float = 0.7


@app.post("/chat")
async def chat_completion(request: ChatRequest):
    try:
        # 构建消息数组
        messages = []

        # 1. 添加系统提示（如果有）
        if request.system_prompt:
            messages.append({"role": "system", "content": request.system_prompt})

        # 2. 添加对话历史（如果有）
        if request.conversation_history:
            messages.extend(request.conversation_history)

        # 3. 添加当前用户消息
        messages.append({"role": "user", "content": request.message})

        # 调用API
        response = client.chat.completions.create(
            model=request.model,
            messages=messages,  # 包含系统提示和历史的完整上下文
            max_tokens=request.max_tokens,
            temperature=request.temperature,
            stream=False
        )

        ai_response = response.choices[0].message.content

        return ChatResponse(
            response=ai_response,
            model_used=request.model,
            tokens_used=response.usage.total_tokens if response.usage else None
        )

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"AI 服务调用失败: {str(e)}")

#二、预定义系统提示模板
# 提示词模板库
PROMPT_TEMPLATES = {
    "customer_service": """你是一个专业的客服助手。请用友好、专业的语气回答用户问题。
公司信息：XXX科技有限公司
服务时间：周一至周五 9:00-18:00
请保持耐心和礼貌，如果遇到无法解决的问题，建议用户联系人工客服。""",

    "programming_assistant": """你是一个编程助手，专门帮助解决编程问题。
请提供准确、可执行的代码示例。
注意事项：
1. 解释代码逻辑
2. 指出潜在问题
3. 推荐最佳实践
4. 如果不确定，请明确说明""",

    "creative_writer": """你是一个创意写作助手，擅长各种文体创作。
请根据用户要求创作生动、有趣的内容。
风格要求：语言优美、富有想象力、情感丰富""",

    "knowledge_qa": """你是一个知识问答专家，基于事实回答问题。
回答要求：
1. 基于可靠信息
2. 引用数据来源（如果知道）
3. 区分事实和观点
4. 不知道就说不知道"""
}


class TemplateChatRequest(BaseModel):
    message: str
    template_name: str = "knowledge_qa"  # 默认模板
    conversation_history: List[dict] = None


@app.post("/chat/with-template")
async def chat_with_template(request: TemplateChatRequest):
    # 获取系统提示模板
    system_prompt = PROMPT_TEMPLATES.get(
        request.template_name,
        PROMPT_TEMPLATES["knowledge_qa"]  # 默认回退
    )

    # 构建消息
    messages = [{"role": "system", "content": system_prompt}]

    # 添加历史记录
    if request.conversation_history:
        messages.extend(request.conversation_history)

    # 添加当前消息
    messages.append({"role": "user", "content": request.message})

    # 调用API...

#方案三：动态提示词生成
def generate_dynamic_prompt(conversation_history, user_message):
    """根据对话历史和当前消息生成动态提示词"""

    # 分析对话主题
    recent_topics = analyze_conversation_topic(conversation_history)

    # 根据主题生成针对性提示词
    if "技术" in recent_topics or "编程" in recent_topics:
        base_prompt = PROMPT_TEMPLATES["programming_assistant"]
    elif "客服" in recent_topics or "帮助" in recent_topics:
        base_prompt = PROMPT_TEMPLATES["customer_service"]
    else:
        base_prompt = PROMPT_TEMPLATES["knowledge_qa"]

    # 添加对话上下文信息
    context_aware_prompt = f"""{base_prompt}

当前对话上下文：
- 用户最近关注：{recent_topics}
- 请保持对话连贯性，参考之前的对话内容
- 如果用户重复提问，请用更详细的方式解释
"""
    return context_aware_prompt

#方案四：会话管理类
from typing import List, Dict, Optional
from datetime import datetime
import uuid


class ConversationSession:
    """对话会话管理类"""

    def __init__(self, session_id: str = None, system_prompt: str = None):
        self.session_id = session_id or str(uuid.uuid4())
        self.system_prompt = system_prompt
        self.messages: List[Dict] = []
        self.created_at = datetime.now()
        self.last_activity = datetime.now()

        # 初始化系统提示
        if self.system_prompt:
            self.add_message("system", self.system_prompt)

    def add_message(self, role: str, content: str):
        """添加消息到会话"""
        message = {
            "role": role,
            "content": content,
            "timestamp": datetime.now()
        }
        self.messages.append(message)
        self.last_activity = datetime.now()

    def get_conversation_context(self, max_messages: int = 10) -> List[Dict]:
        """获取对话上下文（最近的消息）"""
        # 返回最近的消息，确保系统提示在最前面
        system_messages = [msg for msg in self.messages if msg["role"] == "system"]
        other_messages = [msg for msg in self.messages if msg["role"] != "system"]

        # 取最近的对话
        recent_messages = other_messages[-max_messages:]

        return system_messages + recent_messages

    def clear_history(self):
        """清空对话历史，但保留系统提示"""
        system_messages = [msg for msg in self.messages if msg["role"] == "system"]
        self.messages = system_messages


# 会话存储（生产环境应该用数据库）
conversation_sessions: Dict[str, ConversationSession] = {}


@app.post("/chat/with-session")
async def chat_with_session(
        message: str,
        session_id: Optional[str] = None,
        system_prompt: Optional[str] = None
):
    # 获取或创建会话
    if session_id and session_id in conversation_sessions:
        session = conversation_sessions[session_id]
    else:
        session = ConversationSession(session_id, system_prompt)
        conversation_sessions[session.session_id] = session

    # 添加用户消息
    session.add_message("user", message)

    # 构建API消息
    api_messages = [
        {"role": msg["role"], "content": msg["content"]}
        for msg in session.get_conversation_context()
    ]

    # 调用API
    response = client.chat.completions.create(
        model="deepseek-ai/DeepSeek-V3",
        messages=api_messages,
        max_tokens=2048,
        temperature=0.7
    )

    ai_response = response.choices[0].message.content

    # 添加AI回复到会话
    session.add_message("assistant", ai_response)

    return {
        "session_id": session.session_id,
        "response": ai_response,
        "tokens_used": response.usage.total_tokens if response.usage else None
    }